package com.malou.client.ventas.movimiento.salida;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.RowNumberer;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.modeloprenda.ModeloPrendas;
import com.malou.client.ventas.tienda.Tiendas;

public class MovimientoSalidaDialog extends Dialog {
	private Button guardar;
	private Button cancelar;
	public Status status;
	private MalouConstants constants = GWT.create(MalouConstants.class);

	public TextField<String> codigo;
	private TextField<String> numero;
	public HiddenField<String> prenda_id;
	public ComboBox<BeanModel> prenda;
	private ComboBox<BeanModel> tienda;
	private NumberField cantidad;
	public NumberField stock;
	private Button addDetalle;
	private Button delDetalle;

	private ListStore<BeanModel> store;

	private Grid<BeanModel> grid;
	private ToolBar toolBar;
	private FormPanel panel;
	private FieldSet headerFieldSet;
	private FieldSet destinityFieldSet;

	public MovimientoSalidaDialog() {
		super();
		setButtons("");
		setResizable(false);
		setModal(true);
		setIconStyle("icon-stock");
		setHeading(constants.movimientoNuevo());
		setSize(800, 450);
		setClosable(true);

		toolBar = new ToolBar();
		panel = new FormPanel();
		panel.setBorders(false);
		panel.setBodyBorder(false);
		panel.setPadding(5);
		panel.setHeaderVisible(false);

		headerFieldSet = new FieldSet();
		headerFieldSet.setHeading(constants.movimientoAgregarDetalle());
		headerFieldSet.setStyleAttribute("padding", "6px");
		headerFieldSet.setLayout(new ColumnLayout());

		destinityFieldSet = new FieldSet();
		destinityFieldSet.setHeading(constants.movimientoDestino());
		destinityFieldSet.setStyleAttribute("padding", "6px");
		destinityFieldSet.setLayout(new ColumnLayout());

		addFields();
		setFocusWidget(codigo);

		Component com[] = { codigo, prenda, cantidad, addDetalle };
		Utilities.Enter(com);

	}

	private void addFields() {

		prenda_id = new HiddenField<String>();
		panel.add(prenda_id);

		ModeloPrendas.movimientoSalidaDialog = this;
		codigo = new TextField<String>();
		codigo.setFieldLabel(constants.movimientoCodigo());

		codigo.addKeyListener(new KeyListener() {

			public void componentKeyDown(ComponentEvent event) {
				if (event.getKeyCode() == KeyCodes.KEY_ENTER) {
					if (codigo.getValue() != null) {
						ModeloPrendas.getPrendaMovimientoSalida(codigo
								.getValue());
						cantidad.focus();
					}
				}
			}
		});

		numero = new TextField<String>();
		numero.setFieldLabel("Nro. documento");
		numero.setAllowBlank(false);
		numero.addKeyListener(new KeyListener() {

			public void componentKeyDown(ComponentEvent event) {
				if (event.getKeyCode() == KeyCodes.KEY_ENTER) {
					if (numero.getValue() != null) {
						guardar.focus();
					}
				}
			}
		});

		ModeloPrendas.autoComplete();

		prenda = new ComboBox<BeanModel>();
		prenda.setFieldLabel(constants.movimientoPrenda());

		prenda.setDisplayField("nombre");
		prenda.setStore(ModeloPrendas.storeAutocomplete);
		prenda.setMinChars(0);
		prenda.setValueField("nombre");
		prenda.setHideTrigger(true);
		prenda.setPageSize(10);
		prenda.setUseQueryCache(false);
		prenda.setTriggerAction(TriggerAction.ALL);

		prenda.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {

			@Override
			public void selectionChanged(SelectionChangedEvent<BeanModel> se) {
				if (se.getSelectedItem() != null) {
					codigo.setValue(se.getSelectedItem().get("codigo")
							.toString());
					prenda_id.setValue(se.getSelectedItem().get("id")
							.toString());
					stock.setValue(Integer.valueOf(se.getSelectedItem()
							.get("stock").toString()));
				}
			}
		});

		cantidad = new NumberField();
		cantidad.setFieldLabel(constants.movimientoCantidad());
		cantidad.setAllowNegative(false);
		cantidad.setAllowDecimals(false);
		cantidad.setPropertyEditorType(Integer.class);
		cantidad.setMinValue(1);

		Tiendas.getComboOtherTienda();

		tienda = new ComboBox<BeanModel>();
		tienda.setFieldLabel("Tienda destino para salida");
		tienda.setMinChars(0);
		tienda.setAllowBlank(false);
		tienda.setDisplayField("nombre");
		tienda.setEmptyText("Seleccione...");
		tienda.setStore(Tiendas.storeOtherCombo);
		tienda.setTypeAhead(true);
		tienda.setTriggerAction(TriggerAction.ALL);
		tienda.setValueField("nombre");
		tienda.setUseQueryCache(false);
		tienda.addListener(Events.Expand, new Listener<BaseEvent>() {
			@Override
			public void handleEvent(BaseEvent be) {
				tienda.clearSelections();
			}

		});
		tienda.getStore().addStoreListener(new StoreListener<BeanModel>() {
			public void storeDataChanged(StoreEvent<BeanModel> se) {
				tienda.getStore().filter("nombre", tienda.getRawValue());
			}
		});

		stock = new NumberField();
		stock.setReadOnly(true);
		stock.setFieldLabel("Stock");
		stock.setPropertyEditorType(Integer.class);

		addDetalle = new Button(constants.agregar());
		addDetalle.setStyleAttribute("marginTop", "19px");
		addDetalle.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				agregarDetalle();
			}
		});

		delDetalle = new Button(constants.eliminar(),
				IconHelper.createPath("images/icons/delete.gif"));
		delDetalle.setEnabled(false);
		delDetalle.addSelectionListener(new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				BeanModel be = grid.getSelectionModel().getSelectedItem();
				grid.getStore().remove(be);

			}
		});
		toolBar.add(delDetalle);

		store = new ListStore<BeanModel>();

		RowNumberer r = new RowNumberer();
		ArrayList<ColumnConfig> columns = new ArrayList<ColumnConfig>();
		ColumnConfig column = new ColumnConfig();
		columns.add(r);
		columns.add(new ColumnConfig("codigo", constants.movimientoCodigo(),
				150));
		columns.add(new ColumnConfig("modeloprenda", constants
				.movimientoPrenda(), 300));
		column = new ColumnConfig("cantidad", constants.movimientoCantidad(),
				80);
		column.setAlignment(HorizontalAlignment.RIGHT);
		columns.add(column);

		ColumnModel cm = new ColumnModel(columns);

		grid = new Grid<BeanModel>(store, cm);
		grid.addPlugin(r);
		grid.setAutoExpandColumn("modeloprenda");

		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						if (be.getSelectedItem() != null)
							delDetalle.setEnabled(true);
						else
							delDetalle.setEnabled(false);
					}
				});

		ContentPanel detalle = new ContentPanel();
		detalle.setHeaderVisible(false);
		detalle.setLayout(new FitLayout());
		detalle.setHeight(240);
		detalle.add(grid);
		detalle.setTopComponent(toolBar);

		headerFieldSet.add(setLayout(codigo, "88%", 40), new ColumnData(.2));
		headerFieldSet.add(setLayout(prenda, "93%", 40), new ColumnData(.43));
		headerFieldSet.add(setLayout(stock, "95%", 30), new ColumnData(.12));
		headerFieldSet.add(setLayout(cantidad, "80%", 48), new ColumnData(.15));
		headerFieldSet.add(addDetalle, new ColumnData(.1));

		destinityFieldSet
				.add(setLayout(tienda, "70%", 150), new ColumnData(.6));
		destinityFieldSet.add(setLayout(numero, "90%", 95), new ColumnData(.4));

		panel.add(headerFieldSet);
		panel.add(detalle);
		panel.add(destinityFieldSet);
		add(panel);

	}

	@Override
	protected void createButtons() {
		super.createButtons();

		if (constants == null) {
			constants = GWT.create(MalouConstants.class);
		}

		status = new Status();
		status.setBusy(constants.guardando());
		status.hide();
		status.setAutoWidth(true);
		getButtonBar().add(status);

		getButtonBar().add(new FillToolItem());

		 cancelar = new Button(constants.cancelar(),IconHelper.createPath("images/icons/cancel.png"));
			cancelar.setSize(70, 25);

		cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				MovimientoSalidaDialog.this.hide();
			}

		});

		guardar = new Button(constants.guardar(),
				IconHelper.createPath("images/icons/save_all.png"));
		guardar.setSize(70, 25);


		guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				if (validarPrincipal()) {
					status.show();
					getButtonBar().disable();

					List<MovimientoSalida> list = new ArrayList<MovimientoSalida>();
					MovimientoSalida me;

					for (BeanModel b : store.getModels()) {
						me = new MovimientoSalida();
						me.setModeloprenda_id(Integer.valueOf(b.get(
								"modeloprenda_id").toString()));
						me.setModeloprenda(b.get("modeloprenda").toString());
						me.setCantidad(Integer.valueOf(b.get("cantidad")
								.toString()));
						me.setFecha(new Date());
						if (tienda.getValue() != null)
							me.setTiendadestino_id(Integer.valueOf(tienda
									.getValue().get("id").toString()));
						me.setNumero(numero.getValue());

						list.add(me);
					}

					MovimientoSalidas.movimientoSalidaDialog = MovimientoSalidaDialog.this;
					MovimientoSalidas.save(list);
				}
			}
		});

		addButton(guardar);
		addButton(cancelar);

	}

	public boolean validarDetalle() {
		codigo.setAllowBlank(false);
		prenda.setAllowBlank(false);
		cantidad.setAllowBlank(false);

		boolean cod = codigo.isValid();
		boolean pre = prenda.isValid();

		boolean cant = cantidad.isValid();

		boolean stockDisponible = true;
		boolean stockSuficiente = true;
		if (cod && pre && cant) {
			Integer st = Integer.valueOf(stock.getValue().toString());
			if (st == 0) {
				stockDisponible = false;
				MessageBox.alert(constants.sistemaMarcocruzado(),
						constants.ventaNoExistePrenda(), null);
			} else if (cant) {
				Integer stCant = Integer
						.valueOf(cantidad.getValue().toString());
				if (stCant > st) {
					stockSuficiente = false;
					MessageBox.alert(constants.sistemaMarcocruzado(),
							constants.ventaNoStock(), null);
				}
			}
		}

		codigo.setAllowBlank(true);
		prenda.setAllowBlank(true);
		cantidad.setAllowBlank(true);

		return cod && pre && cant && stockDisponible && stockSuficiente;
	}

	public boolean validarPrincipal() {
		boolean num = numero.isValid();
		boolean tda = tienda.isValid();
		
		boolean det = true;
		if (store.getCount() == 0) {
			det = false;
			MessageBox.alert(constants.sistemaMarcocruzado(),
					constants.detalleRequerido(), null);
			codigo.focus();
		}

		return det&&num&&tda;
	}

	public void clearDetalle() {
		codigo.clear();
		prenda.clear();
		cantidad.clear();
		stock.clear();
	}

	public void clearPrincipal() {

		store.removeAll();
		clearDetalle();
		tienda.clearSelections();
		numero.clear();

	}

	public void agregarDetalle() {
		if (validarDetalle()) {

			Boolean add = true;
			if (store.getCount() > 0) {
				String mp_id = prenda_id.getValue();

				Integer cant = Integer.valueOf(cantidad.getValue().toString());
				Integer st = Integer.valueOf(stock.getValue().toString());
				String mpdetalle_id;

				Integer cantdetalle = 0;

				for (BeanModel b : store.getModels()) {
					mpdetalle_id = b.get("modeloprenda_id").toString();

					if (mpdetalle_id.equals(mp_id)) {
						cantdetalle += Integer.valueOf(b.get("cantidad")
								.toString());
					}
				}

				if (cantdetalle + cant > st) {
					add = false;
					MessageBox.alert(constants.sistemaMarcocruzado(),
							constants.ventaNoStock(), null);
				} else {

					for (BeanModel b : store.getModels()) {
						mpdetalle_id = b.get("modeloprenda_id").toString();

						if (mpdetalle_id.equals(mp_id)) {
							add = false;
							cantdetalle = b.get("cantidad");
							store.getRecord(b).set("cantidad",
									cantdetalle + cant);
							store.commitChanges();
							clearDetalle();
							codigo.focus();
							break;
						}
					}
				}

			}
			if (add) {
				MovimientoSalida dm = new MovimientoSalida();
				dm.setModeloprenda_id(Integer.valueOf(prenda_id.getValue()));
				dm.setModeloprenda(prenda.getRawValue());
				dm.setCodigo(codigo.getValue());
				dm.setCantidad(Integer.valueOf(cantidad.getValue().toString()));

				BeanModelFactory beanModelFactory = BeanModelLookup.get()
						.getFactory(dm.getClass());
				store.add(beanModelFactory.createModel(dm));
				clearDetalle();
				codigo.focus();
			}
		}
	}

	private LayoutContainer setLayout(Component comp, String porcentaje,
			Integer withlabel) {
		LayoutContainer layout = new LayoutContainer();
		FormLayout fl = new FormLayout();
		if (comp.equals(tienda) || comp.equals(numero))
			fl.setLabelAlign(LabelAlign.LEFT);
		else
			fl.setLabelAlign(LabelAlign.TOP);
		fl.setLabelWidth(withlabel);
		layout.setLayout(fl);
		layout.add(comp, new FormData(porcentaje));

		return layout;
	}
}
